搬上cloud後,免不了的都要幫本來團隊中的docker做一些瘦身的動作。
今天來拿一個python的例子解釋,我們如何來進行瘦身。
我們先來看一個例子
FROM python:3.8.12-slim-buster as base
WORKDIR /
RUN apt-get update && \
apt-get install -y apt-utils && \
apt-get install -y procps && \
apt-get install -y gcc && \
apt-get install -y --no-install-recommends vim && \
apt-get install -y htop && \
rm -rf /var/lib/apt/lists/* && \
apt-get clean
RUN pip install --upgrade pip
RUN pip install pipenv
ADD Pipfile.lock .
ADD Pipfile .
RUN pipenv sync --system
ADD src ctr_modeling/src
ADD temp/test_data.pkl ctr_modeling/temp/test_data.pkl
ADD model ctr_modeling/model
CMD ["python3", "ctr_modeling/src/modeling_process.py"]
這樣build完的size大約會在
aaa latest 24e45968b3c0 About a minute ago 2.25GB
首先呢這樣的一個Dockerfile會為了pip有可能要build東西裝了些gcc的套件,另外也會多裝了一些python的bin,我們可以透過一些multustaging的手段來解決
像下面這個改動。
FROM python:3.8.12-slim-buster as base
WORKDIR /
ENV PYROOT /pyroot
ENV PYTHONUSERBASE $PYROOT
FROM base as builder
RUN apt-get update && \
apt-get install -y apt-utils build-essential && \
rm -rf /var/lib/apt/lists/* && \
apt-get clean
RUN pip install --upgrade pip
RUN pip install pipenv
ADD Pipfile .
#ADD Pipfile.lock .
RUN PIP_USER=1 PIP_IGNORE_INSTALLED=1 pipenv clean
RUN PIP_USER=1 PIP_IGNORE_INSTALLED=1 pipenv sync --system
#RUN PIP_USER=1 PIP_IGNORE_INSTALLED=1 pipenv install --system
FROM base
COPY --from=builder $PYROOT/lib/ $PYROOT/lib/
RUN apt-get update && \
apt-get install -y apt-utils \
procps \
net-tools && \
apt-get install -y --no-install-recommends vim &&\
rm -rf /var/lib/apt/lists/* && \
apt-get clean
RUN pip install --ignore-installed six
ADD src ctr_modeling/src
CMD ["python3", "ctr_modeling/src/modeling_process.py"]
特別注意COPY --from=builder這一行
我們把前一個builder stage的$PYROOT/lib中的套件拉過來
那我們用上面的方法build 大概size會到多少呢?
bbb latest f50100479b20 19 seconds ago 1.25GB
馬上從2.25 GB 瘦身到 1.25 GB
大家可以多利用multi-stage來幫自己的python image做些瘦身
另外推薦大家兩個工具
一個是dfimage
另一個是dive
這兩個都可以用來分析docker image的組成